package com.edu.exam.entity.examination.online;

import com.edu.exam.entity.curriculum.classification.QuestionType;
import com.edu.exam.enums.exam.AnswerStatus;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 答题记录实体类
 *
 * <p>答题记录实体用于记录学生在考试过程中的答题信息，包括答案内容、
 * 答题时间、修改历史、答题状态等。支持答案的实时保存和版本管理。</p>
 *
 * <p>核心功能：
 * - 答题内容记录：记录学生选择的答案内容和答题过程
 * - 时间戳管理：精确记录答题的开始时间、结束时间和修改时间
 * - 答题状态跟踪：跟踪答题的完成状态和提交状态
 * - 版本控制：支持答案的版本管理和修改历史
 * - 自动保存：支持答案的自动保存和断线续答</p>
 *
 * @author 系统生成
 * @version 2.0
 * @since 2025-11-09
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class AnswerRecord {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 会话ID
     *
     * <p>关联的考试会话ID，标识答题记录所属的会话。</p>
     */
    @Column(name = "session_id", nullable = false, length = 32)
    private String sessionId;

    /**
     * 学生ID
     *
     * <p>答题学生的ID，关联系统学生表。</p>
     */
    @Column(name = "student_id", nullable = false, length = 32)
    private String studentId;

    /**
     * 学生姓名
     *
     * <p>答题学生的姓名，冗余存储用于显示。</p>
     */
    @Column(name = "student_name", nullable = false, length = 100)
    private String studentName;

    /**
     * 题目ID
     *
     * <p>答题对应的题目ID。</p>
     */
    @Column(name = "question_id", nullable = false, length = 32)
    private String questionId;

    /**
     * 题目序号
     *
     * <p>题目在试卷中的序号。</p>
     */
    @Column(name = "question_sequence")
    private Integer questionSequence;

    /**
     * 题目类型
     *
     * <p>题目的类型。
     * 支持的类型：SINGLE_CHOICE（单选题）、MULTIPLE_CHOICE（多选题）、TRUE_FALSE（判断题）、
     * FILL_BLANK（填空题）、ESSAY（问答题）、PROGRAMMING（编程题）等</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "question_type", nullable = false, length = 30)
    private QuestionType questionType;

    /**
     * 答案内容
     *
     * <p>学生的答案内容，JSON格式。
     * 根据题目类型存储不同格式的答案数据。</p>
     */
    @Column(name = "answer_content", columnDefinition = "TEXT")
    private String answerContent;

    /**
     * 原始答案
     *
     * <p>学生输入的原始答案内容。
     * 未经格式化处理的原始输入。</p>
     */
    @Column(name = "raw_answer", columnDefinition = "TEXT")
    private String rawAnswer;

    /**
     * 答案状态
     *
     * <p>答题记录的状态。
     * 支持的状态：NOT_STARTED（未开始）、IN_PROGRESS（答题中）、COMPLETED（已完成）、
     * SUBMITTED（已提交）、MODIFIED（已修改）等</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "answer_status", nullable = false, length = 20)
    private AnswerStatus answerStatus = AnswerStatus.NOT_STARTED;

    /**
     * 开始答题时间
     *
     * <p>学生开始答题的时间。</p>
     */
    @Column(name = "start_time")
    private LocalDateTime startTime;

    /**
     * 最后修改时间
     *
     * <p>答案最后修改的时间。</p>
     */
    @Column(name = "last_modified_time")
    private LocalDateTime lastModifiedTime;

    /**
     * 提交时间
     *
     * <p>答案提交的时间。</p>
     */
    @Column(name = "submit_time")
    private LocalDateTime submitTime;

    /**
     * 答题用时（秒）
     *
     * <p>答题所用的总时间，单位为秒。
     * 由系统自动计算。</p>
     */
    @Column(name = "time_spent_seconds")
    private Long timeSpentSeconds;

    /**
     * 修改次数
     *
     * <p>答案修改的次数。</p>
     */
    @Column(name = "modification_count")
    private Integer modificationCount = 0;

    /**
     * 答题次数
     *
     * <p>查看题目的次数。</p>
     */
    @Column(name = "view_count")
    private Integer viewCount = 0;

    /**
     * 得分
     *
     * <p>答题得分，由阅卷系统评定。</p>
     */
    @Column(name = "score", precision = 5, scale = 2)
    private BigDecimal score;

    /**
     * 满分
     *
     * <p>题目满分。</p>
     */
    @Column(name = "full_score", precision = 5, scale = 2)
    private BigDecimal fullScore;

    /**
     * 得分率
     *
     * <p>答题得分率，百分比形式。</p>
     */
    @Column(name = "score_percentage", precision = 5, scale = 2)
    private BigDecimal scorePercentage;

    /**
     * 评语
     *
     * <p>阅卷教师的评语。</p>
     */
    @Column(name = "comments", columnDefinition = "TEXT")
    private String comments;

    /**
     * 阅卷教师ID
     *
     * <p>阅卷教师的ID。</p>
     */
    @Column(name = "grader_id", length = 32)
    private String graderId;

    /**
     * 阅卷教师姓名
     *
     * <p>阅卷教师的姓名。</p>
     */
    @Column(name = "grader_name", length = 100)
    private String graderName;

    /**
     * 阅卷时间
     *
     * <p>阅卷完成的时间。</p>
     */
    @Column(name = "grading_time")
    private LocalDateTime gradingTime;

    /**
     * 是否标记为复查
     *
     * <p>是否标记为需要人工复查。</p>
     */
    @Column(name = "flagged_for_review", nullable = false)
    private Boolean flaggedForReview = false;

    /**
     * 复查原因
     *
     * <p>标记复查的原因。</p>
     */
    @Column(name = "review_reason", length = 500)
    private String reviewReason;

    /**
     * 答案版本
     *
     * <p>答案的版本号。</p>
     */
    @Column(name = "answer_version")
    private Integer answerVersion = 1;

    /**
     * 上一版本答案
     *
     * <p>上一版本的答案内容，用于版本对比。</p>
     */
    @Column(name = "previous_answer", columnDefinition = "TEXT")
    private String previousAnswer;

    /**
     * 答案哈希值
     *
     * <p>答案内容的哈希值，用于检测答案是否被篡改。</p>
     */
    @Column(name = "answer_hash", length = 64)
    private String answerHash;

    /**
     * 答题设备信息
     *
     * <p>答题时的设备信息，JSON格式。</p>
     */
    @Column(name = "device_info", columnDefinition = "TEXT")
    private String deviceInfo;

    /**
     * 答题环境信息
     *
     * <p>答题时的环境信息，JSON格式。</p>
     */
    @Column(name = "environment_info", columnDefinition = "TEXT")
    private String environmentInfo;

    /**
     * 异常信息
     *
     * <p>答题过程中的异常信息。</p>
     */
    @Column(name = "error_message", columnDefinition = "TEXT")
    private String errorMessage;

    /**
     * 答题备注
     *
     * <p>答题相关的备注信息。</p>
     */
    @Column(name = "answer_notes", columnDefinition = "TEXT")
    private String answerNotes;

    /**
     * 是否自动保存
     *
     * <p>是否通过自动保存功能保存的答案。</p>
     */
    @Column(name = "is_auto_saved", nullable = false)
    private Boolean isAutoSaved = false;

    /**
     * 最后自动保存时间
     *
     * <p>最后一次自动保存的时间。</p>
     */
    @Column(name = "last_auto_save_time")
    private LocalDateTime lastAutoSaveTime;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreatedDate
    @Column(name = "created_time", nullable = false, updatable = false)
    private LocalDateTime createdTime;

    /**
     * 更新时间
     */
    @LastModifiedDate
    @Column(name = "updated_time", nullable = false)
    private LocalDateTime updatedTime;
}